home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 52
/
Amiga Format AFCD52 (Issue 136, May 2000).iso
/
-serious-
/
programming
/
other
/
littelcomp
/
r5
/
lc
/
fdtool.e
< prev
next >
Wrap
Text File
|
2000-02-28
|
5KB
|
189 lines
-> AUTHOR : Leif_Salomonsson@swipnet.se
-> STATUS : FREEWARE
-> this little proggy takes a fd file with
-> all the functions listed and turns it into
-> autodoc format.
-> added possibility to create LITTEL macro functions.
MODULE '*extractwords'
MODULE 'afc/parser'
MODULE 'dos/dos'
DEF p=NIL:PTR TO parser
DEF ew=NIL:PTR TO extractwords
DEF fh2=NIL
PROC main() HANDLE
DEF fh=NIL
DEF flen=NIL
DEF buf[25000]:ARRAY OF CHAR
DEF end
NEW p.parser()
IF p.parse('INFILE/A,NAME/A,OUTFILE/A,TARGET/A', arg)=NIL THEN Raise("ARG")
flen := FileLength(p.arg(0))
IF flen < 1 THEN Raise("INFI")
NEW ew.new(1, 500)
fh := Open(p.arg(0), MODE_OLDFILE)
Read(fh, buf, flen)
fh2 := Open(p.arg(2), MODE_NEWFILE)
end := buf + flen
IF StrCmp(p.arg(3), 'AD') = TRUE
bla1(buf, end, fh2)
bla2(buf, end, fh2)
ELSEIF StrCmp(p.arg(3), 'MF')=TRUE
makeMacroFunctions(buf, end, fh2)
ELSEIF StrCmp(p.arg(3), 'E')=TRUE
WriteF('TARGET not implemented yet!\n')
ELSE
WriteF('TARGET unknown!\n')
ENDIF
EXCEPT DO
SELECT exception
CASE "INFI" ; WriteF('Cant open INFILE!\n')
CASE "ARG" ; WriteF('Please give me some/right arguments!')
ENDSELECT
IF fh THEN Close(fh)
IF fh2 THEN Close(fh2)
ENDPROC
PROC bla1(buf, end, fh2)
DEF str[100]:STRING
DEF tstr[100]:STRING
DEF private=FALSE
write('TABLE OF CONTENTS\n\n')
WHILE buf <> end
ew.extract(buf)
IF StrCmp(buf, '##', 2) = FALSE
IF private = FALSE
IF StrCmp(buf, '*', 1) = FALSE
StrCopy(tstr, ew.getWord(0), InStr(ew.getWord(0), '('))
StringF(str, '\s/\s\n', p.arg(1), tstr)
write(str)
ENDIF
ENDIF
ELSE
IF StrCmp(buf, '##private', 9) = TRUE THEN private := TRUE
IF StrCmp(buf, '##public', 8) = TRUE THEN private := FALSE
ENDIF
buf := nextLine(buf)
ENDWHILE
write('\n\n')
ENDPROC
PROC bla2(buf, end, fh2)
DEF str[100]:STRING
DEF tstr[100]:STRING
DEF private=FALSE
WHILE buf <> end
ew.extract(buf)
IF StrCmp(buf, '##', 2) = FALSE
IF private = FALSE
IF StrCmp(buf, '*', 1) = FALSE
StrCopy(tstr, ew.getWord(0), InStr(ew.getWord(0), '('))
StringF(str, '\c\s/\s\n\n', 12, p.arg(1), tstr)
write(str)
StringF(str, ' NAME\n \s -\n', tstr)
write(str)
StringF(str, ' SYNOPSIS\n \s\n', ew.getWord(0))
write(str)
write(' FUNCTION\n')
write(' INPUTS\n')
write(' RESULTS\n')
write(' EXAMPLE\n')
write(' NOTES\n')
write(' BUGS\n')
write(' SEE ALSO\n')
write('\n')
ENDIF
ENDIF
ELSE
IF StrCmp(buf, '##private', 9) = TRUE THEN private := TRUE
IF StrCmp(buf, '##public', 8) = TRUE THEN private := FALSE
ENDIF
buf := nextLine(buf)
ENDWHILE
ENDPROC
PROC makeMacroFunctions(buf, end, fh2)
DEF str[200]:STRING
DEF nstr[100]:STRING
DEF rstr[200]:STRING
DEF private=FALSE
DEF basestr[50]:STRING
DEF r
DEF bias
-> ew.extract(buf)
StrCopy(basestr, 'unknownBase')
WHILE buf <> end
ew.extract(buf)
IF StrCmp(buf, '##bias', 6) = TRUE THEN bias := -Val(buf+6)
IF StrCmp(buf, '##base', 6) = TRUE THEN StrCopy(basestr, ew.getWord(1))
IF StrCmp(buf, '##', 2) = FALSE
IF StrCmp(buf, '*', 1) = FALSE
IF private = FALSE
StrCopy(nstr, ew.getWord(0), InStr(ew.getWord(0), '('))
StrCopy(rstr, ew.getWord(0) + InStr(ew.getWord(0), ')(') + 2)
SetStr(rstr, EstrLen(rstr)-1)
StringF(str, ' macro x\s\n', nstr)
write(str)
r := rstr
r := bla(r)
r := bla(r)
r := bla(r)
r := bla(r)
r := bla(r)
r := bla(r)
r := bla(r)
r := bla(r)
r := bla(r)
r := bla(r)
r := bla(r)
StringF(str, ' move.l \s(a4), a6\n', basestr)
write(str)
StringF(str, ' jsr \d(a6)\n', bias, nstr)
write(str)
write(' endm\n')
ENDIF
bias := bias - 6
ENDIF
ELSE
IF StrCmp(buf, '##private', 9) = TRUE THEN private := TRUE
IF StrCmp(buf, '##public', 8) = TRUE THEN private := FALSE
ENDIF
buf := nextLine(buf)
ENDWHILE
ENDPROC
PROC bla(rstr)
DEF str[100]:STRING
IF StrLen(rstr) > 0
StringF(str, ' move.l (a7)+, \s[2]\n', rstr)
write(str)
rstr := rstr + 3
ENDIF
ENDPROC rstr
PROC write(str) IS Write(fh2, str, StrLen(str))
/* borrowing function frpm lc17.e */
PROC nextLine(str:PTR TO CHAR)
WHILE str[] <> 10 DO str++
->linenum++
str++
WHILE str[] = 10
str++
->linenum++
ENDWHILE
ENDPROC str